﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace 线程
{
    class Program
    {
        public int whatever;


        //static readonly编译期变量 在声明时赋值

        static readonly object locker = new object();


        //true表示将初始状态设置为终止状态

        static EventWaitHandle _wait = new AutoResetEvent(false);




        static void Main(string[] args)
        {
            //var t = new Thread(F);
            //t.Start();


            // Console.WriteLine(Thread.CurrentThread.ManagedThreadId);
            // var thread = new Thread(F2);

            //thread.IsBackground = true;

            // thread.Start("dddd");

            // Console.WriteLine("离开主线程");

            //Program p = new Program();

            //new Thread(p.PrintVariable).Start();

            //p.PrintVariable();


            new Thread(Waiter).Start();

            Thread.Sleep(1000);

            _wait.Set();//发出指示

            /**
               AutoResetEvent就像地铁入口的十字转门，有票插入，就让进，而且每次只让一个人进。
                ○ 当调用WaitOne方法，表示该线程已被阻塞，正在等待信号，就像十字转门旁等待进入的乘客。
                ○ 当调用Set方法，表示发出信号给等待线程，就像十字转门收到车票，乘客可以通过。
            **/








            Console.ReadKey();


        }

        static void Waiter()

        {

            Console.WriteLine("一切准备就绪，等待指示！");

            _wait.WaitOne();

            Console.WriteLine("收到指示~~");

        }



        void PrintVariable()
        {
            lock (locker)
            {
                whatever++;
                Console.WriteLine("线程#" + Thread.CurrentThread.ManagedThreadId + " 执行后whatever变量为：" + whatever);
            }
        }



        public static void F()
        {
            Console.WriteLine("线程跑起来！");
        }
        public static void F2(object a)
        {
            Console.WriteLine("带参数的线程跑起来！"+a);
        }

    }
}
